<?php

namespace app\admin\controller;

use think\Db;
use think\Validate;

// 作业
class Task extends Auth
{
    // 载入页面
    public function task()
    {
        // 查询学科
        $course = DB::table('v1_course')->order('v1_course.course_id desc')->select();
        // 页面赋值
        $this->assign('course', $course);
        // 返回视图页面
        return view("/page/task");
    }

    // 获取作业列表
    public function getList()
    {
        try {
            // 获取请求信息
            $request = $this->request;
            // 是否传入标题
            if ($request->has('taskName', 'get') && $request->get('taskName') != '') {
                // 根据标题条件查询
                $info['where']['v1_task.task_name'] = ['=', $request->get('taskName')];
            }
            // 是否传入学科ID
            if ($request->has('courseId', 'get') && $request->get('courseId') != '') {
                // 根据学科ID条件查询
                $info['where']['v1_task.course_id'] = ['=', $request->get('courseId')];
            }
            // 操作表
            $info['table'] = 'v1_task';
            // 别名处理
            $field  = '
            v1_task.*,
            v1_student.student_name,
            v1_course.course_name';
            // 设置别名
            $info['field'] = $field;
            // 是否不分页获取全部数据
            if (!$request->has('list', 'get') && $request->get('list') != 'all') {
                // 分页
                $info['limit'] = $this->getPageing();
            }
            // 排序
            $info['order'] = "v1_task.task_id desc";
            // 链表
            $info['join'] = [
                ["v1_course", "v1_task.course_id=v1_course.course_id"],
                ["v1_student", "v1_course.student_id=v1_student.student_id"],
            ];
            // 查询数据
            return $this->queryList($info);
        } catch (\Exception $e) {
            // 返回空数据
            return json($this->initEmptyData());
        }
    }

    // 添加作业
    public function addInfo()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 2) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'taskDueDate' => 'require',
                'taskSuffix' => 'require',
                'courseId' => 'require',
                'taskName' => 'require',
            ], [
                'taskDueDate.require' => '请选择截止时间',
                'taskSuffix.require' => '请选择附件格式',
                'courseId.require' => '请选择所属学科',
                'taskName.require' => '请输入作业名称',
            ]);
            // 时间转时间戳
            $time = strtotime($request->post('taskDueDate'));
            // 判断验证是否通过1
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 添加数据处理
                    $data = [
                        "task_name" => $request->post('taskName'),
                        "course_id" => $request->post('courseId'),
                        "task_suffix" => $request->post('taskSuffix'),
                        "task_due_date" => $time,
                    ];
                    // 添加数据
                    $res = Db::table('v1_task')->insertGetId($data);
                    // 判断数据是否添加成功
                    if ($res >= 0) {
                        // 判断作业是否推送成功
                        if ($this->pushTasks($res, $request->post('courseId'))) {
                            // 事务提交
                            Db::commit();
                            // 返回信息
                            return json($this->initTips(200, '添加成功'));
                        } else {
                            // 事务回滚
                            Db::rollback();
                            //返回推送失败信息
                            return json($this->initTips(400, "推送失败"));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        // 返回添加失败信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    // 编辑作业
    public function editInfo()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 2) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'id' => 'require',
                'taskDueDate' => 'require',
                'taskSuffix' => 'require',
                'courseId' => 'require',
                'taskName' => 'require',
            ], [
                'id.require' => 'ID不能为空',
                'taskDueDate.require' => '请选择截止时间',
                'taskSuffix.require' => '请选择附件格式',
                'courseId.require' => '请选择所属学科',
                'taskName.require' => '请输入作业名称',
            ]);
            // 时间转时间戳
            $time = strtotime($request->post('taskDueDate'));
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 查询历史学科信息
                    $course_id = DB::table('v1_task')->where('task_id', $request->post('id'))->value('course_id');
                    // 修改数据处理
                    $data = [
                        "task_name" => $request->post('taskName'),
                        "course_id" => $request->post('courseId'),
                        "task_suffix" => $request->post('taskSuffix'),
                        "task_due_date" => $time,
                    ];
                    // 修改数据
                    $res = Db::table('v1_task')->where('task_id', $request->post('id'))->update($data);
                    // 判断数据是否修改成功
                    if ($res >= 0) {
                        // 判断是否更新学科
                        if ($course_id != $request->post('courseId')) {
                            // 修改同学作业所属学科
                            if ($this->editTaskCourse($request->post('id'), $request->post('courseId'))) {
                                // 事务提交
                                Db::commit();
                                // 返回信息
                                return json($this->initTips(200, '修改成功'));
                            } else {
                                // 事务回滚
                                Db::rollback();
                                // 返回失败信息
                                return json($this->initTips(400));
                            }
                        } else {
                            // 事务提交
                            Db::commit();
                            // 返回信息
                            return json($this->initTips(200, '修改成功'));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        // 返回失败信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    // 删除作业
    public function delInfoAll()
    {
        try {
            // 验证是否管理员
            if (session(USERPOWER) > 2) {
                return json($this->initTips(300, "权限不足"));
            }
            // 获取请求信息
            $request = $this->request;
            // 信息验证
            $validate = new Validate([
                'ids' => 'require'
            ], [
                'ids.require' => '删除ID不能为空'
            ]);
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 如果不是数组转为数组
                    if (!is_array($request->post('ids'))) {
                        $_data = explode(",", $request->post('ids'));
                    } else {
                        $_data = $request->post('ids');
                    }
                    // 删除数据
                    $res = Db::table('v1_task')->where('task_id', 'in', $_data)->delete();
                    // 判断数据是否添加成功
                    if ($res >= 0) {
                        // 删除作业记录
                        if ($this->delTaskRecord($_data)) {
                            // 事务提交
                            Db::commit();
                            // 返回信息
                            return json($this->initTips(200, '删除成功'));
                        } else {
                            // 事务回滚
                            Db::rollback();
                            // 返回信息
                            return json($this->initTips(400));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        // 返回信息
                        return json($this->initTips(400));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } catch (\Exception $e) {
            // 处理异常抛出
            return json($this->initTips());
        }
    }

    /**
     * 批量作业发布
     * $task_id 作业ID $course_id学科ID
     */
    public function pushTasks($task_id, $course_id)
    {
        Db::startTrans(); //开启事务
        try {
            if ($task_id && $course_id) {
                $res = false;
                $data = [];
                // 获取学生列表
                $user  = DB::table('v1_student')->where("student_power", '>', '1')->column('student_id');
                //用户是否存在
                if ($user) {
                    // 批量插入数据处理
                    foreach ($user as $key => $value) {
                        $data[$key] = [
                            'course_id' => $course_id,
                            'task_id' => $task_id,
                            'student_id' => $value
                        ];
                    }
                    // 批量提交
                    $res = DB::table('v1_task_record')->insertAll($data);
                    if ($res) {
                        // 事务提交
                        Db::commit();
                    } else {
                        // 事务回滚
                        Db::rollback();
                    }
                }
                return $res;
            } else {
                return false;
            }
        } catch (\Exception $e) {
            return false;
        }
    }


    /**
     * 修改作业所属学科
     * $task_id 作业ID $course_id学科ID
     */
    public function editTaskCourse($task_id, $course_id)
    {
        Db::startTrans(); //开启事务
        try {
            $res = false;
            // 修改参数是否存在
            if ($task_id && $course_id) {
                $res =  DB::table('v1_task_record')->where('task_id', $task_id)->update(['course_id' => $course_id]);
                if ($res) {
                    // 事务提交
                    Db::commit();
                } else {
                    // 事务回滚
                    Db::rollback();
                }
            }

            return $res;
        } catch (\Exception $e) {
            return false;
        }
    }

    // 删除作业记录
    public function delTaskRecord($task_id)
    {
        Db::startTrans(); //开启事务
        try {
            $res = false;
            // 删除参数是否存在
            if ($task_id) {
                $res =  DB::table('v1_task_record')->where('task_id', 'in', $task_id)->delete();
                if ($res) {
                    // 事务提交
                    Db::commit();
                } else {
                    // 事务回滚
                    Db::rollback();
                }
            }
            return $res;
        } catch (\Exception $e) {
            return false;
        }
    }


    // 作业发布
    public function pushTask()
    {
        $user  = DB::table('v1_student')->where("student_power", '>', '1')->column('student_id');
        dd($user);
    }
}
